﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Configuration;
using System.Xml;
using Lcsoft.UrlRewriter.Actions;
using Lcsoft.UrlRewriter.Configuration;
using Lcsoft.UrlRewriter.Utilities;

namespace Lcsoft.UrlRewriter.Parsers
{
	/// <summary>
	/// 为地址重写动作解析器提供基类。
	/// </summary>
	public sealed class SetCookieActionParser : RewriteActionParserBase
	{
		/// <summary>
		/// 获取动作名。
		/// </summary>
		public override string Name
		{
			get { return Constants.ElementSet; }
		}

		/// <summary>
		/// 获取一个值，该值指示当前动作是否允许嵌套动作。
		/// </summary>
		public override bool AllowsNestedActions
		{
			get { return false; }
		}

		/// <summary>
		/// 获取一个值，该值指示当前动作是否允许包含 Attribute 属性。
		/// </summary>
		public override bool AllowsAttributes
		{
			get { return true; }
		}

		/// <summary>
		/// 执行地址重写动作解析。
		/// </summary>
		/// <param name="node">包含要解析的动作信息的。</param>
		/// <param name="config">地址重写配置信息。</param>
		/// <returns>返回地址重写动作的实例。</returns>
		public override IRewriteAction Parse(XmlNode node, RewriterConfiguration config)
		{
			if (node == null) throw new ArgumentNullException("node");
			if (node.Attributes == null) throw new ArgumentOutOfRangeException("node");

			if (config == null) throw new ArgumentNullException("config");

			var cookieNameNode = node.Attributes.GetNamedItem(Constants.AttrCookie);

			if (cookieNameNode == null) return null;

			var cookieValueNode = node.Attributes.GetNamedItem(Constants.AttrValue);

			if (cookieValueNode == null) throw new ConfigurationErrorsException(MessageProvider.FormatString(Message.AttributeRequired, Constants.AttrValue), node);

			return new SetCookieAction(cookieNameNode.Value, cookieValueNode.Value);
		}
	}
}
